"""
闭包中的变量引用：
lambda y: x * y 中的 x 是一个自由变量，它会引用外部作用域中的 x。
在 Python 中，闭包中的变量是后期绑定（late binding），也就是说，它们会在函数调用时查找变量的当前值，而不是定义时的值。
循环变量的作用域：
for x in range(1, 4) 中的 x 是循环变量，它在循环结束后保留最后一个值（即 3）。
所有 lambda 函数共享这个 x，因此调用时 x 的值始终是 3。
"""


def main() -> None:
    multipliers = []
    for x in range(1, 4):
        multipliers.append(lambda y: x * y)

    m1, m2, m3 = multipliers

    print(m1(10))
    print(m2(10))
    print(m3(10))


def testify():
    multipliers = []
    for x in range(1, 4):
        multipliers.append(lambda y, x=x: x * y)  # 使用默认参数捕获 x

    m1, m2, m3 = multipliers

    print(m1(10))  # 输出 10
    print(m2(10))  # 输出 20
    print(m3(10))  # 输出 30


if __name__ == "__main__":
    main()
    testify()
